from typing import Optional, Union
from yandex_music import (
    Client,
    Playlist,
    Queue,
    Station,
    Track
)


class YandexMusic:
    """
    Класс по работе с API Яндекс.Музыки,
    нужно что-бы получать активности и данные о треках
    """

    ym_client: Client

    def __init__(self, token: str) -> None:
        """
        Инициализировать класс

        Args:
            token (str): Токен для авторизации в Яндекс.Музыки 
        """

        # Получение клиента
        self.ym_client = Client(token=token).init()

    def get_last_activity(self) -> Optional[Queue]:
        """
        Получение последнего активности

        Returns:
            Optional[Queue]: "Очередь" активности
        """

        # Получение список очереди
        current_queues = self.ym_client.queues_list()

        # Если ничего нету в очереди
        if len(current_queues) < 0:
            # Возращаем ничего
            return None

        # Получение последнее очереди
        last_queue = self.ym_client.queue(current_queues[0].id)

        # Возращаем последнее очереди
        return last_queue

    def get_current_track_from_activity(self,
                                        queue: Queue) -> Optional[Track]:
        """
        Получение текущего трек из активности

        Args:
            queue (Queue): "Очередь" активности

        Returns:
            Optional[Track]: Информация о треке
        """

        # Если ничего нету в список с треками
        if len(queue.tracks) < 0:
            # Возращаем ничего
            return None

        # Получение ID текущего трека
        track_id = queue.get_current_track()

        try:
            # Попытка получить трек
            current_track = track_id.fetch_track()
            
            # Возращаем ничего
            return current_track
        except:
            # Возращаем ничего
            return None

    def get_playlist(self, id: str) -> Optional[Playlist]:
        """
        Получение плейлист по ID

        Args:
            id (str): ID плейлиста

        Returns:
            Optional[Playlist]: Плейлист
        """

        # Получение ID автора и плейлиста
        author_id = id.split(':')[0]
        playlist_id = id.split(':')[1]

        # Получение плейлиста
        playlist = self.ym_client.users_playlists(playlist_id, author_id)

        # Возращаем плейлист
        return playlist

    def get_radio(self, id: str) -> Optional[Station]:
        """
        Получение потока по ID

        Args:
            id (str): ID потока

        Returns:
            Optional[Station]: Поток
        """

        # Получение лист станции
        stations = self.ym_client.rotor_stations_list()

        # Цикл с станциям
        for station in stations:
            # Если ID равный
            if id == f'{station.station.id.type}:{station.station.id.tag}':
                # Возращаем станцию
                return station

        # Возращаем ничего
        return None
